﻿#pragma once

#include "../Utilities/Math.h"

#define WINDOW_WIDTH 960.0f
#define WINDOW_HEIGHT 720.0f
#define PERSPECTIVE_ANGLE 45.0f
#define PERSPECTIVE_NEAR 0.1f
#define PERSPECTIVE_FAR 10000.0f


//để biễu diễn các vật trong không gian của camera
//chúng ta cần biến ma trận biến đổi từ worlspace sáng viewspace
//ma trận đó được gọi là viewMatrix
// ==>> viewMatrix dùng để biến đổi từ worldspace sáng view space

//kết quả ta nhìn thấy là
//viewMatrix * worldMatrix * P;
//trong đó worldMatrix là ma trận biến đổi để đưa vật P vào một vị trí nào đó trong bản đồ
//còn viewMatrix là ma trận biến đổi để đưa vật đó vào tầm nhìn hay view space hay camera space
//cách tính world space ta đã biết

//P là một điểm thuộc object
//nó nằm ở object space
//chúng ta đưa đối tượng vào bản đồ game hay world space bằng cách đưa tất cả các điểm trên object vào world space, ở đây mình lấy 1 điểm làm đại diện
//bằng cách nhân với worldMatrix
//worldMatrix mọi người đã biết cách tính rồi
//tiếp theo chúng ta sẽ đưa vật đó vào camera space hay vào tầm nhìn của mình
//bằng cách nhân với ma trận biến đổi từ world space sang camera space hay viewMatrix
//P' = viewMatrix * worldMatrix * P;
//	worldMatrix = scale * rotZ * rotX * rotY * translate;
//	với scale, rotZ, rotX, rotY, translate là các ma trận biến đổi của vật
//	viewMatrix = tran( -pos ) * rotY( -a ) * rotX( -b ) * rotZ( - c );
//	với pos vec3(a, b, c) là vị trí và góc quay của camera trong world space



//ban đầu từ tọa độ 3D sẽ được chuyển thành tọa độ 4D (x,y,z,w)
//-	Sau đó nó nhân cho ma trận biến đổi (Quay, tịnh tiến…). (Modelview Matrix)
//-	Tiếp tục tới ma trận chiếu (Projection Matrix)
//-	Sau đó là cắt xén những đa giác có thể không thấy được (Division)
//-	Chuyển tọa độ 4D thành tọa độ 3D
//-	Chuyển tiếp 3D thành 2D (loại bỏ z)
//-	Biến đổi trên 2D (viewport transformation, quy định gốc tọa độ, co giãn 2D…) 
//-	Vẽ ra của sổ.
class Camera
{
public:
	//static Camera* m_instance;
	
	Vector3 m_position;
	Vector3 m_target;
	Vector3 m_up;
	Matrix	 m_view,m_world, mProjectionMatrix;

	char m_refreshFlags;
	Camera();
	void MoveW(float deltaTime);
	void MoveS(float deltaTime);
	void MoveA(float deltaTime);
	void MoveD(float deltaTime);
	void MoveUp(float deltaTime);
	void MoveDown(float deltaTime);
	void RotUp(float deltaTime);
	void RotDown(float deltaTime);
	void RotLeft(float deltaTime);
	void RotRight(float deltaTime);
	void Init();
	void Update();
	Matrix getCamera();
	//static Camera* GetInstance();	
	void destroy();
		Matrix& CalculateViewMatrix();
	Matrix& CalculateWorldMatrix();
};